文件和图片的上传功能

文件和图片上传功能现在已经是一个很重要的功能,在实际的网站等应用之中也拥有比较重的地位,这一小节我们将给大家介绍一下简单的文件上传实现。

rails的API中一个简单的文件上传的方法file_field


file_field方法 file_field(object_name,method,options = {})

返回一个文件上传的对话框选择适合上传的文件(由文件模版和方法决定)。更多的可选参数可以通过一个哈希(hash)传递给输入对话框,这些可选参数在后面会进行相应的说明。 配合form_for使用file_field方法我们将可以建立一个闭合的上传文件的表单。

Options

  • 创建标准的html属性标签
  • :disabled 当该属性设置为true时,用户将不能使用该输入框
  • :multiple 当该属性的值为true时,最新的浏览器将能够支持文件多选。
  • :accept 如果被设置为可以接受一个或者多个mime-types,用户再上传文件的时候就需要一定的删选,同时你也需要建立一个类型的验证机制。

Examples

file_field(:user, :avatar)
=><input type="file" id="user_avatar" name="user[avatar]" />

file_field(:post, :image, :multiple => true)
=><input type="file" id="post_image" name="post[image]" multiple="true" />

file_field(:post, :attached, accept: 'text/html')
=><input accept="text/html" type="file" id="post_attached" name="post[attached]" />

file_field(:post, :image, accept: 'image/png,image/gif,image/jpeg')
=><input type="file" id="post_image" name="post[image]" accept="image/png,image/gif,image/jpeg" />

file_field(:attachment, :file, class: 'file_input')
=><input type="file" id="attachment_file" name="attachment[file]" class="file_input" />

这里还有一些比较好用的jquery插件可以实现文件的上传功能,这里简单介绍一款jquery File Upload的插件 详细信息可以参阅这些文档

下面是一些示例代码。

  • 简单快速的安装使用

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8">
    <title>jQuery File Upload Example</title>
    </head>
    <body>
    
    <p>构建html代码</p>
    <input id="fileupload" type="file" name="files[]" data-url="server/php/" multiple>
    
    <p>引入核心文件</p>
    <script src="http://libs.useso.com/js/jquery/jquery/1.9.1/jquery.min.js"></script>
    <script src="js/vendor/jquery.ui.widget.js"></script>
    <script src="js/jquery.iframe-transport.js"></script>
    <script src="js/jquery.fileupload.js"></script>
    
    <p>写入JS初始化</p>
    <script>
      $(function () {
      $('#fileupload').fileupload({
      dataType: 'json',
      done: function (e, data) {
      $.each(data.result.files, function (index, file) {
      $('<p/>').text(file.name).appendTo(document.body);
      });
      }
      });
      });
    </script>
    </body>
    </html>
    

    在上面的示例代码中,我们看到使用的json数据类型,服务器返回的也是以json数据格式解析的。实际中,我们可能需要根据自己的需要处理响应式的html内容或者其他的数据类型,这样我们就需要自己 完成时回调自定义的处理函数。

  • 让上传时显示进度条 fileupload进度条的触发事件来源于单个或者多个上传文件的事件,通过预设绑定或者插件的形式都可以实现时间的出发。 进度条的动态显示原理时通过计算的百分比数据来改变bar的宽度实现的,同时我们使用css来控制bar的高度。

    $('#fileupload').fileupload({
    /* ... */
    progressall: function (e, data) {
    var progress = parseInt(data.loaded / data.total * 100, 10);
    $('#progress .bar').css(
    'width',
    progress + '%'
    );
    }});
    
    <div id ="progess">
    <div class = "bar" style = "width: 0%;"></div>
    </div>
    .bar {
    height: 18px;
    background: bule;
    }
    
  • 如何显示是上传中还是上传完毕的状态 通常情况下,我们上传一个文件时我们都要知道其上传状态,如何把相对应的上传状态传递给用户呢? 这里的基本原理是在上传时和完成后分别调用方法来显示。

$(function () {
    $('#fileupload').fileupload({
      dataType: 'json',
      add: function (e, data) {
      data.context = $('<p/>').text('Uploading...').appendTo(document.body);
      data.submit();
      },
      done: function (e, data) {
      data.context.text('Upload finished.');
      }
  });
});
  • 添加开始按钮 在上面的实现中都是选中文件直接上传的,但是大多数时候我们需要选中之后点击开始上传之后上传文件,我们该怎么实现呢? 其实我们只要在data.context中加入html代码和相应的按钮绑定事件就可以了。
$(function () {
    $('#fileupload').fileupload({
        dataType: 'json',
        add: function (e, data) {
        data.context = $('<button/>').text('Upload')
        .appendTo(document.body)
        .click(function () {
          data.context = $('<p/>').text('Uploading...').replaceAll($(this));
          data.submit();
          });
        },
        done: function (e, data) {
        data.context.text('Upload finished.');
        }
  });
});

在我本地的完整代码实现为

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="utf-8">
    <title>jQuery File Upload Example</title>
  </head>
  <body>

    //构建html代码
    <input id="fileupload" type="file" name="files[]" data-url="server/php/" multiple>

    //引入核心文件
    <script src="/Users/logic/workspace/software/jQuery-File-Upload/js/jquery-1.9.1.js"></script>
    <script src="/Users/logic/workspace/software/jQuery-File-Upload/js/vendor/jquery.ui.widget.js"></script>
    <script src="/Users/logic/workspace/software/jQuery-File-Upload/js/jquery.iframe-transport.js"></script>
    <script src="/Users/logic/workspace/software/jQuery-File-Upload/js/jquery.fileupload.js"></script>

    <div id ="progess">
      <div class = "bar" style = "width: 0%;"></div>
    </div>
    <style>
    .bar {
       height: 18px;
       background: blue;
     }
   </style>
    //写入JS初始化
    <script>
      $(function () {
        $('#fileupload').fileupload({
          dataType: 'json',
          add: function (e, data) {
            data.context = $('<button/>').text('Upload')
              .appendTo(document.body)
              .click(function () {
                data.context = $('<p/>').text('Uploading...').replaceAll($(this));
                data.submit();
              });
            },
            done: function (e, data) {
              data.context.text('Upload finished.');
            },
            progressall: function (e, data) {
              var progress = parseInt(data.loaded / data.total * 100, 10);
              $('#progress .bar').css(
              'width',
              progress + '%'
              );
            }});
        });
    </script>
  </body>
</html>

到这里就是基本的jquery file uploader插件的使用方法,更多的实现大家可以直接查阅这些文档

results matching ""

    No results matching ""